package parser


import . "compiler/ast"
import . "compiler/lexer"


// 调用parseStats()函数解析语句序列
// 调用parseRetExps()函数解析可选的返回语句
// 并记录末尾行号
// block ::= {stat} [retstat]
func parseBlock(lexer *Lexer) *Block {

	return &Block{
		Stats:		parseStats(lexer),
		RetExps:	parseRetExps(lexer),
		LastLine:	lexer.Line(),
	}

}


func parseStats(lexer *Lexer) []Stat {

	stats := make([]Stat, 0, 8)

	for !_isReturnOrBlockEnd(lexer.LookAhead()) {

		stat := parseStat(lexer)

		if _, ok := stat.(*EmptyStat); !ok {

			stats = append(stats, stat)
		}
	}

	return stats
}


// 是否是Return语句或者块结束
// 阅读下标, 可以看出block结束的关键字类型
// stat    ::= ';'
//         |   varlist '=' explist
//         |   functioncall
//         |   label
//         |   break
//         |   goto Name
//         |   do block end
//         |   while exp do block end
//         |   repeat block until exp
//         |   if exp then block {elseif exp then block} [else block] end
//         |   for Name '=' exp ',' exp [',' exp] do block end
//         |   for namelist in explist do block end
//         |   function funcname funcbody
//         |   local function Name funcbody
//         |   local namelist ['=' explist]
func _isReturnOrBlockEnd(tokenKind int) bool {
	switch tokenKind {
		case TOKEN_KW_RETURN, TOKEN_EOF, TOKEN_KW_END,
		TOKEN_KW_ELSE, TOKEN_KW_ELSEIF, TOKEN_KW_UNTIL:
			return true
	}

	return false
}


// 解析返回表达式列表
// retstat ::= return [explist] [‘;’]
// explist ::= exp {‘,’ exp}
func parseRetExps(lexer *Lexer) []Exp {

	if lexer.LookAhead() != TOKEN_KW_RETURN {
		return nil
	}

	lexer.NextToken()  // 跳过return关键字

	switch lexer.LookAhead() {
		// 块已经结束
		case TOKEN_EOF, TOKEN_KW_END, TOKEN_KW_ELSE,
			TOKEN_KW_ELSEIF, TOKEN_KW_UNTIL:
			return []Exp{}
		// 分号
		case TOKEN_SEP_SEMI:
			lexer.NextToken()		// 跳过分号
			return []Exp{}
		default:
			exps := parseExpList(lexer)
			if lexer.LookAhead() == TOKEN_SEP_SEMI {
				lexer.NextToken()		// 跳过分号
			}
			return exps
	}

}